package com.example.program;

import org.junit.Test;

/**
 * 现给定一个string inistring字符串(长度小于等于
 * 10000)，请按连续重复字母压缩的方式将该字符串
 * 压缩，返回结果为string， 比如，字符串
 * "aabbcccccaaa”经压缩会变成"a2b2c5a3"，若压
 * 缩后的宇符串没有变短，则返回原先的字符串。注
 * 意保证串内字符均由大小写英文字母组成。
 * 测试样例
 * 输入：”aabcccccaaa”
 * 输出：“a2b1c5a3”
 *
 * @author zhouronghua
 * @time 2022/3/24 8:08 下午
 */
public class StringCompat {

    public static final String INVALID_STR = "";

    public static final int MAX_LEN = 10000;

    /**
     * 压缩字符串
     *
     * @param inputStr 输入字符串
     * @return 压缩后的字符串
     */
    public String stringCompact(String inputStr) {
        if (inputStr == null || inputStr.length() > MAX_LEN
            || inputStr.length() == 0) {
            return INVALID_STR;
        }
        // 字符串压缩
        StringBuilder builder = new StringBuilder();
        if (inputStr.length() == 1) {
            builder.append(inputStr);
            builder.append(1);
            return builder.toString();
        }
        // 同一个字符个数
        int count = 1;
        int len = inputStr.length();
        char cChar = inputStr.charAt(0);
        builder.append(cChar);
        for (int i = 1; i < len; i++) {
            if (inputStr.charAt(i) == cChar) {
                // 如果字符数相等
                count++;
            } else {
                // 如果不等于则需要保存上一个字符的结果重新记录
                builder.append(count);
                // 重置计数器
                cChar = inputStr.charAt(i);
                builder.append(cChar);
                count = 1;
            }
        }
        builder.append(count);
        // 压缩后没有变短返回源字符串
        return builder.length() < len ? builder.toString() : inputStr;
    }

    @Test
    public void testString() {
        System.out.println(stringCompact("aabcccccaaa"));
    }

//    public static void main(String[] args) {
//
//    }

}
